<?php
declare(strict_types=1);

namespace app\middleware;

use app\model\{Admin, Menu};
use think\Request;
use Closure;

class AdminAuth extends BaseAuth
{
    /**
     * 处理请求
     */
    public function handle(Request $request, Closure $next)
    {
        // 验证 JWT token
        [$valid, $info] = $this->validateToken($request);
        if (!$valid) {
            return $this->error($info, 401);
        }

        // 获取管理员信息
        $admin = Admin::with('role')->where('id', $info['id'])->find();
        if (!$admin) {
            return $this->error('管理员不存在', 401);
        }

        // 检查管理员状态
        if (!$admin->isAvailable()) {
            return $this->error('管理员账号已被禁用', 403);
        }

        // 检查路由权限
        if (!$this->checkPermission($admin, $request->pathinfo())) {
            return $this->error('无权限访问', 403);
        }

        // 将管理员信息注入到 request 中
        $request->admin = $admin;
        
        return $next($request);
    }

    /**
     * 获取守卫名称
     */
    protected function getGuard(): string
    {
        return 'admin';
    }

    /**
     * 检查权限
     */
    protected function checkPermission(Admin $admin, string $path): bool
    {
        // 超级管理员跳过权限检查
        if ($admin->id === 1) {
            return true;
        }

        // 获取管理员角色的菜单权限
        $menus = Menu::whereIn('id', $admin->role->menu_ids ?? [])->select();
        if ($menus->isEmpty()) {
            return false;
        }

        // 检查是否有权限访问当前路径
        foreach ($menus as $menu) {
            if ($menu->menu_url && strpos($path, $menu->menu_url) === 0) {
                return true;
            }
        }

        return false;
    }
} 